package org.wdcode.core.dao.jdbc;

import org.wdcode.common.util.CommonUtil;
import org.wdcode.core.datasource.DataSource;
import org.wdcode.core.datasource.DataSourceFactory;
import org.wdcode.core.factory.BaseFactory;

/**
 * 生成DataBase的工厂类
 * @see org.wdcode.common.dao.jdbc.DataBase
 * @author WD
 * @since JDK6
 * @version 1.0 2009-08-25
 */
public final class DataBaseFactory extends BaseFactory<DataBase> {
	// DataBase工厂
	private final static DataBaseFactory	FACTORY;

	// 静态初始化
	static {
		FACTORY = new DataBaseFactory();
	}

	/**
	 * 获得DataBase工厂
	 * @return DataBase工厂
	 */
	public final static DataBaseFactory getFactory() {
		return FACTORY;
	}

	/**
	 * 实例化一个新的DataBase,根据配置文件生成DataBase.<br/>
	 * <h2>注: 这个方法将调用在配置文件内的配置生成对象,如果没配置或配置错误,<br/>
	 * 那将返回一个没有dataSource的DataBase ,如果要使用需要自行setDataSource<br/>
	 * 注: 这个方法每次都生成新的对象,并且只是当次运行的,<br/>
	 * 在方法调用后无法在得到这个DataBase的引用,包括调用getInstance(xxx)方法</h2>
	 * @return DataBase 数据库操作对象
	 */
	public DataBase newInstance() {
		return newInstance(DataSourceFactory.getFactory().getInstance());
	}

	/**
	 * 使用DataSource实例一个新的DataBase <br/>
	 * <h2>注: 这个方法每次都生成新的对象,并且只是当次运行的,<br/>
	 * 在方法调用后无法在得到这个DataBase的引用,包括调用getInstance(xxx)方法</h2>
	 * @param dataSource 数据源
	 * @return DataBase 数据库操作对象
	 */
	public DataBase newInstance(DataSource dataSource) {
		return new DataBaseImpl(dataSource);
	}

	/**
	 * newInstance的单例实现 <br/>
	 * <h2>注: 如果数据库连接被关闭或不存在或和你要使用的连接不是一个都将优先分配传入的连接</h2>
	 * @param dataSource 数据源
	 * @return DataBase 数据库操作对象
	 */
	public DataBase getInstance(DataSource dataSource) {
		// 判断如果db为null
		if (CommonUtil.isEmpty(e)) {
			// 获得db
			e = getInstance();
			// 设置数据源
			e.setDataSource(dataSource);
		}
		// 返回db
		return e;
	}

	/**
	 * 私有构造函数,禁止外部实例化
	 */
	private DataBaseFactory() {
		super();
	}
}
